#ifndef C_LEXER_H
#define C_LEXER_H
#include "../common_defs.h"

#ifdef __cplusplus
extern "C" {
#endif

// Token结构体 - 扩展版本
typedef struct ShowToken {
    TokenType type;
    char* text;
    int line;
    int column;
    int value;       // 用于数字和符号表索引
    int hash;        // 标识符的哈希值
} ShowToken;

// 词法错误类型
typedef enum {
    ERR_IDENTIFIER,           // 标识符错误
    ERR_DECIMAL_NUMBER,       // 十进制数错误
    ERR_OCTAL_NUMBER,        // 八进制数错误
    ERR_HEX_NUMBER,          // 十六进制数错误
    ERR_FLOAT_NUMBER,        // 浮点数错误
    ERR_CHAR_CONST,          // 字符常量错误
    ERR_STRING_CONST,        // 字符串常量错误
    ERR_COMMENT,             // 注释错误
    ERR_INVALID_CHAR,        // 非法字符错误
    ERR_PREPROCESSOR,        // 预处理指令错误
    ERR_ILLEGAL_IDENTIFIER,  // 非法标识符
    ERR_NUMBER_FORMAT,       // 数字格式错误
    ERR_ILLEGAL_ESCAPE,      // 非法转义序列
    ERR_STRING_CHAR_FORMAT,  // 字符串/字符格式错误
    ERR_UNCLOSED_COMMENT,    // 未闭合的注释
    ERR_ILLEGAL_WHITESPACE,  // 非法空白字符
    ERR_PREPROCESSOR_FORMAT, // 预处理指令格式错误
    ERR_UNCLOSED_STRING,     // 未闭合的字符串
    ERR_KEYWORD_MISUSE,      // 关键字误用
    ERR_ILLEGAL_OPERATOR     // 非法运算符组合
} LexErrorType;

// 词法错误结构
typedef struct {
    LexErrorType type;       // 错误类型
    int line;                // 错误行号
    int column;              // 错误列号
    char* message;           // 错误描述
} LexError;

// 词法分析结果结构体
typedef struct {
    ShowToken* tokens;       // 词法单元数组
    int count;               // 词法单元数量
    char* error;            // 通用错误信息
    LexError* errors;        // 词法错误数组
    int error_count;         // 词法错误数量
} LexResult;

// 导出函数声明
void init_lexer(const char* code);
void init_keywords();


// 分析C源代码，返回token列表 (兼容旧接口)
LexResult* analyze_c_code(const char* code);

// 释放词法分析结果
void free_lex_result(LexResult* result);

// 获取结果的字符串表示
char* get_result_string(LexResult* result);

// 获取错误结果的字符串表示，用于UI界面错误框
char* get_error_string(LexResult* result);

// 释放get_result_string或get_error_string返回的字符串
void free_result_string(char* result_string);

#ifdef __cplusplus
}
#endif

#endif /* C_LEXER_H */ 